package com.example.springsecurity02.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @ Description：前后端分离项目  自定义失败处理逻辑
 * @ Tool：IntelliJ IDEA
 * @ Author：lk
 * @ Date：2024-10-17-12:22 AM
 * @ Version：1.0
 */
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {

    /**
     * 处理认证失败的情况
     * 当用户尝试访问他们未授权的资源时，此方法将被调用，用于处理认证失败的情况
     *
     * @param request   HTTP请求对象，包含请求的详细信息
     * @param response  HTTP响应对象，用于向客户端发送响应
     * @param exception 认证异常对象，包含认证失败的原因
     * @throws IOException      如果处理过程中发生输入输出异常
     * @throws ServletException 如果处理过程中发生Servlet异常
     */
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        // 创建一个结果映射，用于存储错误信息和状态码
        Map<String, Object> result = new HashMap<>();

        // 将错误信息包装为JSON响应的内容
        result.put("msg", "登录事变" + exception.getMessage());
        result.put("status", 500);

        // 设置响应的内容类型为JSON，并指定字符集为UTF-8
        response.setContentType("application/json;charset=UTF-8");

        // 将结果映射转换为JSON字符串
        String s = new ObjectMapper().writeValueAsString(result);

        // 通过响应对象的输出流，将JSON字符串写入响应，从而返回给客户端
        response.getWriter().println(s);
    }
}